package com.ruoyi.common.core.text;

import com.ruoyi.common.core.utils.StringUtils;

/**
 * 版本号管理工具
 *
 * @author 张岩
 */
public class VersionNumber {

    /**
     * 版本号增大级别
     */
    public enum Grade {

        /**
         * 小
         */
        SMALL,

        /**
         * 中
         */
        CENTRE,

        /**
         * 大
         */
        BIG
    }

    /**
     * 版本号格式规范
     */
    private static final String VERSION_REGEX = "[0-9]+.[0-9]+.[0-9]+";

    /**
     * 默认初始版本号
     */
    private static final String INITIAL_VERSION = "1.0.0";

    /**
     * 获取初始化版本号
     *
     * @return 初始化版本号：1.0.0
     */
    public static String getInitialVersion() {
        return INITIAL_VERSION;
    }

    /**
     * 版本号递增<br />
     *          某一级版本号递增后，其更小级别的版本号码将会被重置
     *
     * @param startVersion 待增加的版本号
     * @param grade 版本号增大级别
     * @return 递增后的版本号<br />
     *          如果初始化版本号为空，则返回初始化版本号<br />
     *          正常情况返回递增后的版本号<br />
     *          其它异常情况返回null
     */
    public static String getNewVersion(String startVersion, Grade grade) {
        if (StringUtils.isEmpty(startVersion)) {
            return INITIAL_VERSION;
        }
        if (!startVersion.matches(VERSION_REGEX)) {
            return null;
        }
        String[] versionArray = startVersion.split("\\.");
        int versionI, i;
        switch (grade) {
            case BIG:
                i = 0;
                versionArray[1] = "0";
                versionArray[2] = "0";
                break;
            case CENTRE:
                i = 1;
                versionArray[2] = "0";
                break;
            case SMALL:
                i = 2;
                break;
            default:
                return null;
        }
        versionI = Integer.parseInt(versionArray[i]);
        versionI++;
        versionArray[i] = Integer.toString(versionI);
        return StringUtils.join(versionArray, ".");
    }

    /**
     * 版本号比较工具
     *
     * @param v1 版本号
     * @param v2 版本号
     * @return 比较结果（-1、0、1）<br />
     *          如:v1 > v2 -- 返回 1<br />
     *             v1 < v2 -- 返回-1<br />
     *             v1 = v2 -- 返回0<br />
     *             其它异常情况，返回0
     */
    public static int compare(String v1, String v2) {
        if (StringUtils.isEmpty(v1) || StringUtils.isEmpty(v2)) {
            return 0;
        }
        if (!v1.matches(VERSION_REGEX) || !v2.matches(VERSION_REGEX)) {
            return 0;
        }
        String[] v1Array = v1.split("\\.");
        String[] v2Array = v2.split("\\.");
        int iv1, iv2;
        for (int i = 0; i < v1Array.length; i++) {
            iv1 = Integer.parseInt(v1Array[i]);
            iv2 = Integer.parseInt(v2Array[i]);
            if (iv1 != iv2) {
                return iv1 > iv2 ? 1 : -1;
            }
        }
        return 0;
    }

}
